package com.hc.wego.utils;

/**
 *
 * @author hc
 * @date 2025-06-17 10:27
 */
public class StringUtil {
    /**
     * 检查给定的字符串是否为空或空字符串
     * 此方法用于判断字符串是否为null或者长度为0，从而统一处理空字符串和null值，避免空指针异常
     *
     * @param str 要检查的字符串，可以为null
     * @return 如果字符串为null或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(final String str) {
        // 检查字符串是否为null或长度是否为0
        return str == null || str.length() == 0;
    }

    /**
     * 检查给定的字符串是否不为空
     *
     * @param str 待检查的字符串
     * @return 如果字符串不为空，则返回true；否则返回false
     */
    public static boolean isNotEmpty(final String str) {
        return !isEmpty(str);
    }

    /**
     * 判断一个字符串是否为空或仅由空白字符组成
     * 与isEmpty不同，isBlank认为字符串中只包含空白字符也是空的
     *
     * @param str 待检查的字符串
     * @return 如果字符串为null、空或仅由空白字符组成，则返回true；否则返回false
     */
    public static boolean isBlank(final String str) {
        // 检查字符串是否为null或空
        if (str == null || str.length() == 0) {
            return true;
        }

        // 遍历字符串中的每个字符，检查是否有非空白字符
        for (int i = 0; i < str.length(); i++) {
            // 如果字符串中存在非空白字符，则返回false
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        // 字符串中只包含空白字符，返回true
        return true;
    }

    public static boolean isNotBlank(final String str) {
        return !isBlank(str);
    }

    /**
     * 将下划线风格的字符串转换为驼峰风格的字符串
     * 例如，将"under_line_string"转换为"underLineString"
     * 如果字符串为空或不包含下划线，则直接返回原字符串
     *
     * @param str 下划线风格的字符串
     * @return 驼峰风格的字符串
     */
    public static String underline2hump(String str) {
        // 检查字符串是否为空或不包含下划线，如果是，则直接返回
        if (isBlank(str) || !str.contains("_")) {
            return str;
        }

        // 创建StringBuilder以构建最终的驼峰风格字符串
        StringBuilder sb = new StringBuilder(str.length());
        // 标记是否需要将下一个字符转换为大写
        boolean toUpperCase = false;

        // 遍历字符串中的每个字符
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            // 如果当前字符是下划线，则将toUpperCase标记为true
            if (c == '_') {
                toUpperCase = true;
            } else if (toUpperCase) {
                // 如果toUpperCase是true，则将当前字符转换为大写，并重置toUpperCase为false
                sb.append(Character.toUpperCase(c));
                toUpperCase = false;
            } else {
                // 如果toUpperCase是false，则直接追加当前字符
                sb.append(c);
            }
        }

        // 返回构建好的驼峰风格字符串
        return sb.toString();
    }

    /**
     * 将驼峰风格的字符串转换为下划线风格的字符串
     * 例如，将"camelCaseString"转换为"camel_case_string"
     * 如果字符串为空或不包含大写字母，则直接返回原字符串
     *
     * @param str 驼峰风格的字符串
     * @return 下划线风格的字符串
     */
    public static String hump2underline(String str) {
        if (isBlank(str)) {
            return str;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isUpperCase(c)) {
                if (i > 0) {
                    sb.append('_');
                }
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

}
